Ansible এ শর্ত ভিত্তিক (Conditional) এবং লুপ (Loop) ফিচার দুটি প্লেবুকের কার্যকারিতা ও ফ্লেক্সিবিলিটি বাড়ানোর জন্য খুবই গুরুত্বপূর্ণ। এগুলির মাধ্যমে আপনি টাস্কগুলোকে কন্ডিশনাল বা পুনরাবৃত্তিমূলক করে তুলতে পারেন। আসুন, এই দুটি সম্পর্কে বিস্তারিত জানি।
Ansible এ টাস্কগুলোকে নির্দিষ্ট শর্তের উপর ভিত্তি করে চালানো যায়। শর্ত পূরণ না হলে সেই টাস্কটি স্কিপ করা হয়। এটি প্লেবুকে ডায়নামিক সিদ্ধান্ত নেওয়ার জন্য ব্যবহৃত হয়।
when
when
কিওয়ার্ড ব্যবহার করে শর্ত নির্ধারণ করা হয়। এটি একটি লজিক্যাল এক্সপ্রেশন বা ভ্যারিয়েবলের মান চেক করে।when
কন্ডিশনটি সত্য (True) হয়, তাহলে সেই টাস্কটি চালানো হবে। অন্যথায়, এটি স্কিপ করা হবে।---
- name: Conditional Task Example
hosts: localhost
tasks:
- name: Install Apache only on Debian systems
apt:
name: apache2
state: present
when: ansible_facts['os_family'] == 'Debian'
ব্যাখ্যা:
when
কন্ডিশন ব্যবহার করে চেক করা হয়েছে যে সিস্টেমের অপারেটিং সিস্টেম ফ্যামিলি Debian
কিনা।Debian
হয়, তাহলে apache2
ইনস্টল করা হবে; নতুবা টাস্কটি স্কিপ হবে।---
- name: Example with registered variable
hosts: localhost
tasks:
- name: Check if a file exists
stat:
path: /etc/passwd
register: file_check
- name: Display message if file exists
debug:
msg: "The file exists!"
when: file_check.stat.exists
ব্যাখ্যা:
stat
মডিউল দিয়ে ফাইল চেক করা হয়েছে এবং ফলাফল file_check
এ সংরক্ষণ করা হয়েছে।file_check.stat.exists
সত্য হবে অর্থাৎ ফাইলটি সিস্টেমে বিদ্যমান।Ansible এ loop
ব্যবহার করে একই টাস্ককে একাধিক মানের উপর পুনরাবৃত্তি করে চালানো যায়। এটি তখনই কার্যকর, যখন আপনাকে একই ধরনের কাজ একাধিক মান বা আইটেমের উপর করতে হয়।
loop
loop
কিওয়ার্ডের মাধ্যমে আপনি একটি লিস্ট বা আইটেম সেট নির্ধারণ করতে পারেন এবং সেই লিস্টের প্রতিটি আইটেমের উপর টাস্কটি চালানো হবে।---
- name: Install multiple packages
hosts: localhost
tasks:
- name: Install necessary packages
apt:
name: "{{ item }}"
state: present
loop:
- apache2
- mysql-server
- php
ব্যাখ্যা:
loop
দিয়ে একটি লিস্ট ব্যবহার করা হয়েছে যাতে তিনটি প্যাকেজ (apache2
, mysql-server
, php
) ইনস্টল করা হবে।---
- name: Add multiple users
hosts: localhost
tasks:
- name: Create users
user:
name: "{{ item.name }}"
state: present
shell: "{{ item.shell }}"
loop:
- { name: 'alice', shell: '/bin/bash' }
- { name: 'bob', shell: '/bin/zsh' }
ব্যাখ্যা:
name
এবং shell
কনফিগারেশন উল্লেখ করা আছে।user
মডিউলটি প্রতিটি আইটেমের জন্য চালানো হচ্ছে এবং নতুন ইউজার তৈরি করা হচ্ছে।Ansible এর আগের সংস্করণে loop
এর পরিবর্তে with_items
ব্যবহার করা হতো। এটি এখন পুরনো ফর্ম্যাট হিসেবে বিবেচিত হলেও এখনো অনেক স্ক্রিপ্টে এটি দেখা যায়:
---
- name: Install packages with with_items
hosts: localhost
tasks:
- name: Install multiple packages
apt:
name: "{{ item }}"
state: present
with_items:
- apache2
- mysql-server
- php
কখনও কখনও আপনি লুপের চলার প্রক্রিয়া নিয়ন্ত্রণ করতে চান, যেমন লুপের ইনডেক্স ব্যবহার করা বা প্রতিটি লুপের মধ্যে একটি নির্দিষ্ট সময় বিরতি দেওয়া। এর জন্য loop_control
ব্যবহার করা যায়।
---
- name: Loop control example
hosts: localhost
tasks:
- name: Install packages with index
apt:
name: "{{ item }}"
state: present
loop:
- apache2
- mysql-server
- php
loop_control:
index_var: loop_index
- name: Display loop index
debug:
msg: "This is the {{ loop_index }} iteration."
বৈশিষ্ট্য | শর্ত ভিত্তিক (Conditional) | লুপ (Loop) |
---|---|---|
কিভাবে কাজ করে | নির্দিষ্ট শর্তের উপর ভিত্তি করে টাস্ক চালায় | একটি লিস্টের প্রতিটি আইটেমের উপর টাস্ক পুনরাবৃত্তি করে চালায় |
কিওয়ার্ড | when | loop , with_items |
ব্যবহার | সিস্টেম স্টেট বা ভ্যারিয়েবলের মান চেক করা | একাধিক আইটেমের উপর একই ধরনের টাস্ক চালানো |
এই ফিচারগুলো Ansible প্লেবুককে আরও ডায়নামিক, ফ্লেক্সিবল এবং এফিশিয়েন্ট করে তোলে।
Ansible এ when কন্ডিশন ব্যবহার করে আপনি নির্দিষ্ট শর্ত (condition) মেনে টাস্ক নিয়ন্ত্রণ করতে পারেন। অর্থাৎ, আপনি টাস্ক বা টাস্কগুলিকে এমনভাবে কন্ডিশনাল করতে পারেন যেন তা শুধুমাত্র নির্দিষ্ট শর্ত পূরণ হলেই কার্যকর হয়। এটি Ansible প্লেবুককে ডাইনামিক এবং নমনীয় করতে সাহায্য করে।
when কন্ডিশন সাধারণত একটি লজিক্যাল এক্সপ্রেশন গ্রহণ করে, যা সত্য (true) বা মিথ্যা (false) হতে পারে। যদি কন্ডিশন সত্য হয়, তাহলে টাস্কটি কার্যকর হয়; অন্যথায়, তা স্কিপ করা হয়।
tasks:
- name: Task Name
module_name:
parameter: value
when: condition
নিচের উদাহরণে আমরা দেখবো কিভাবে when কন্ডিশন ব্যবহার করে একটি টাস্ককে নির্দিষ্ট অপারেটিং সিস্টেমে কার্যকর করা যায়।
---
- name: Install Apache only on Ubuntu systems
hosts: all
become: yes
tasks:
- name: Install Apache on Ubuntu
apt:
name: apache2
state: present
when: ansible_distribution == "Ubuntu"
এখানে, when
কন্ডিশন চেক করছে হোস্টের অপারেটিং সিস্টেম Ubuntu কিনা (ansible_distribution == "Ubuntu"
)। যদি হোস্টের অপারেটিং সিস্টেম Ubuntu হয়, তখন Apache ইনস্টল করা হবে।
অনেক সময় প্লেবুকে ডিফাইন করা ভ্যারিয়েবল বা হোস্ট ভ্যারিয়েবলের উপর ভিত্তি করে টাস্ক নিয়ন্ত্রণ করতে হয়।
---
- name: Install Nginx based on variable
hosts: all
become: yes
vars:
install_nginx: true
tasks:
- name: Install Nginx
apt:
name: nginx
state: present
when: install_nginx
এখানে, install_nginx
নামে একটি ভ্যারিয়েবল তৈরি করা হয়েছে। যদি এর মান true
হয়, তাহলে Nginx ইনস্টল করা হবে।
কিছু কিছু ক্ষেত্রে, একটি টাস্কের আউটপুট বা রেজাল্টের উপর ভিত্তি করে পরবর্তী টাস্ক কার্যকর করা হয়।
---
- name: Check if a file exists and create if it doesn't
hosts: all
become: yes
tasks:
- name: Check if /tmp/testfile exists
stat:
path: /tmp/testfile
register: file_status
- name: Create the file if it doesn't exist
file:
path: /tmp/testfile
state: touch
when: not file_status.stat.exists
এখানে, প্রথম টাস্কটি /tmp/testfile
ফাইলের স্ট্যাটাস চেক করে এবং আউটপুট file_status
নামে রেজিস্টারে সংরক্ষণ করে। পরবর্তী টাস্কটি when
কন্ডিশন ব্যবহার করে চেক করে যদি ফাইলটি না থাকে (not file_status.stat.exists
), তখন এটি ফাইল তৈরি করবে।
when কন্ডিশনে আপনি বিভিন্ন অপারেটর এবং লজিক্যাল এক্সপ্রেশন ব্যবহার করতে পারেন:
- name: Install package if OS is Ubuntu and version is 20.04
apt:
name: apache2
state: present
when: ansible_distribution == "Ubuntu" and ansible_distribution_version == "20.04"
এখানে, Apache ইনস্টল করা হবে শুধুমাত্র যদি অপারেটিং সিস্টেম Ubuntu হয় এবং এর ভার্সন 20.04 হয়।
Ansible এ when কন্ডিশন ব্যবহার করে টাস্ক বা টাস্কগুলোকে নির্দিষ্ট শর্ত অনুযায়ী কার্যকর করা যায়। এটি প্লেবুককে ডাইনামিক এবং নমনীয় করে তোলে, যাতে বিভিন্ন হোস্ট বা ভ্যারিয়েবলের ভিত্তিতে স্বয়ংক্রিয়ভাবে কাজ সম্পন্ন করা যায়।
Ansible-এ লুপ ব্যবহার করা হয় একাধিক আইটেম বা উপাদানের উপর একই কাজ বারবার চালানোর জন্য। লুপ ব্যবহার করে আপনি একটি টাস্ককে পুনরাবৃত্তি করতে পারেন, যা প্লেবুককে আরও কার্যকর এবং সংক্ষিপ্ত করে তোলে। Ansible-এ লুপের জন্য প্রধানত দুটি পদ্ধতি ব্যবহৃত হয়: loop
এবং with_items
। Ansible 2.5 থেকে loop
পদ্ধতিটি প্রচলিত এবং এটি নতুনতম ও আরও কার্যকর উপায়, যেখানে with_items
পুরোনো এবং সামঞ্জস্য বজায় রাখার জন্য রাখা হয়েছে।
loop
ব্যবহারloop
হলো Ansible-এ লুপ চালানোর আধুনিক পদ্ধতি। এটি সাধারণত এক বা একাধিক আইটেমের উপর টাস্ক পুনরাবৃত্তি করার জন্য ব্যবহার করা হয়। এটি সহজ, সরল এবং পড়তে সুবিধাজনক।
নিচে একটি সাধারণ উদাহরণ দেয়া হলো যেখানে একটি সার্ভার-এ একাধিক প্যাকেজ ইনস্টল করা হচ্ছে:
---
- name: Install multiple packages
hosts: all
become: yes
tasks:
- name: Install packages
yum:
name: "{{ item }}"
state: present
loop:
- httpd
- mariadb-server
- php
বিশ্লেষণ:
loop
ব্যবহার করে একাধিক প্যাকেজ (httpd
, mariadb-server
, php
) ইনস্টল করা হচ্ছে।{{ item }}
হলো লুপের প্রতিটি আইটেমের মান, যা প্রতিবার লুপ চলার সময় পরিবর্তিত হয়।loop
এর আরও উদাহরণএকটি ফাইলের মালিকানা পরিবর্তন করতে নিচের মত লুপ ব্যবহার করা যেতে পারে:
---
- name: Change ownership of files
hosts: all
become: yes
tasks:
- name: Set ownership of files
file:
path: "{{ item.path }}"
owner: "{{ item.owner }}"
group: "{{ item.group }}"
mode: "{{ item.mode }}"
loop:
- { path: /var/www/html/index.html, owner: apache, group: apache, mode: '0644' }
- { path: /var/www/html/app.php, owner: apache, group: apache, mode: '0644' }
বিশ্লেষণ:
with_items
ব্যবহারwith_items
হলো লুপ চালানোর পুরোনো পদ্ধতি। এটি loop
এর মত কাজ করে, তবে নতুন সংস্করণগুলোতে loop
ব্যবহারে উৎসাহিত করা হয়। যদিও এটি এখনও কার্যকর, এটি মূলত পুরোনো প্লেবুকগুলোর সাথে সামঞ্জস্য বজায় রাখার জন্য রাখা হয়েছে।
নিচে একটি উদাহরণ দেয়া হলো যেখানে with_items
ব্যবহার করে একাধিক প্যাকেজ ইনস্টল করা হচ্ছে:
---
- name: Install multiple packages
hosts: all
become: yes
tasks:
- name: Install packages
yum:
name: "{{ item }}"
state: present
with_items:
- httpd
- mariadb-server
- php
loop
এবং with_items
এর তুলনাবৈশিষ্ট্য | loop | with_items |
---|---|---|
আধুনিকতা | নতুন এবং প্রচলিত | পুরোনো এবং সামঞ্জস্য বজায় রাখার জন্য |
সিনট্যাক্স | সহজ এবং সরল | কিছুটা বেশি লিখতে হয় |
কার্যকারিতা | অধিক কার্যকর | সাধারণ কার্যকর, তবে পুরোনো পদ্ধতি |
loop
: নতুন এবং আধুনিক পদ্ধতি, যা সাধারণত ব্যবহার করা উচিত।with_items
: পুরোনো পদ্ধতি, যা পুরোনো প্লেবুকগুলোর সামঞ্জস্য রক্ষার জন্য রাখা হয়েছে।Ansible প্লেবুক লেখার সময় loop
ব্যবহার করা হলে কোড আরও সংক্ষিপ্ত এবং কার্যকর হয়। with_items
ব্যবহার করা যায়, তবে নতুন কোড লেখার সময় loop
ব্যবহারে উৎসাহিত করা হয়।
Ansible এ block এবং rescue ব্যবহার করে ত্রুটি নিয়ন্ত্রণ (Error Handling) খুব সহজ এবং কার্যকরী হয়। block এবং rescue কিওয়ার্ডগুলোর মাধ্যমে আপনি প্লেবুকে এমনভাবে টাস্ক লিখতে পারেন, যাতে কোনো টাস্ক ব্যর্থ হলেও আপনি সেগুলোর উপর নিয়ন্ত্রণ রাখতে পারেন এবং ব্যর্থতার পরবর্তী অ্যাকশন নির্ধারণ করতে পারেন। এটি প্রায় প্রোগ্রামিং ভাষার try-catch মেকানিজমের মতো।
Ansible এ block
একটি ব্লক তৈরি করে যার মধ্যে একাধিক টাস্ক গ্রুপ করা যায়। এর সাথে rescue
এবং always
ব্যবহার করে ত্রুটি বা ব্যতিক্রম নিয়ন্ত্রণ করা যায়।
rescue
চালানো হবে।block
এর কোনো টাস্ক ব্যর্থ হয়, তখন rescue
ব্লকটি চালানো হয়। এটি সাধারণত ব্যাকআপ প্ল্যান বা এরর হ্যান্ডলিংয়ের জন্য ব্যবহৃত হয়।always
ব্লক সবসময় চালানো হয়, এটি block
বা rescue
সফল বা ব্যর্থ যাই হোক না কেন। এটি পরিষ্কার করার কাজ বা ফাইনাল টাস্কের জন্য ব্যবহার করা হয়।---
- name: Example of block and rescue
hosts: localhost
tasks:
- name: Main block
block:
- name: Try to create a file
file:
path: /tmp/example.txt
state: touch
- name: Simulate a failure
command: /bin/false
rescue:
- name: Handle the failure by creating a different file
file:
path: /tmp/rescue_file.txt
state: touch
always:
- name: Always clean up
file:
path: /tmp/temp_cleanup.txt
state: touch
Main block:
block
এর মধ্যে দুটি টাস্ক আছে। প্রথম টাস্কটি /tmp/example.txt
ফাইল তৈরি করছে।/bin/false
কমান্ড চালাচ্ছে, যা ইচ্ছাকৃতভাবে ব্যর্থ হবে।Rescue block:
block
এর কোনো টাস্ক ব্যর্থ হবে, তখন rescue
ব্লকটি চালু হবে। এখানে rescue
ব্লকে /tmp/rescue_file.txt
নামে একটি ফাইল তৈরি করা হয়েছে।Always block:
always
ব্লক সবসময় চালানো হবে, চূড়ান্ত কাজ বা ক্লিনআপ কাজ করার জন্য। এখানে /tmp/temp_cleanup.txt
ফাইলটি তৈরি করা হয়েছে।
---
- name: Install a package with error handling
hosts: localhost
tasks:
- name: Install nginx package
block:
- name: Try to install nginx
apt:
name: nginx
state: present
register: install_result
ignore_errors: yes
- name: Verify if nginx was installed
command: nginx -v
register: verify_result
rescue:
- name: Log installation failure
debug:
msg: "Nginx installation failed. Attempting to fix or clean up."
- name: Remove partially installed nginx
apt:
name: nginx
state: absent
always:
- name: Clean up temporary files if any
file:
path: /tmp/nginx_install.log
state: absent
nginx
প্যাকেজ ইনস্টল করা হয়েছে এবং ইনস্টলেশন যাচাই করা হয়েছে। ignore_errors: yes
দিয়ে ইনস্টলেশনের ত্রুটি উপেক্ষা করা হয়েছে যাতে ব্লকের পরবর্তী টাস্ক চালানো যায়।rescue
ব্লক চালানো হবে যেখানে ইনস্টলেশনের ব্যর্থতার কারণে কিছু পরিষ্কার বা ফিক্স করার ব্যবস্থা করা হয়েছে।/tmp/nginx_install.log
ফাইল (যদি কোনো লোগ সংরক্ষণ করা হয়) ক্লিনআপ করা হয়েছে।বৈশিষ্ট্য | বর্ণনা |
---|---|
Block | টাস্কগুলিকে গ্রুপ করে একসাথে চালায়। |
Rescue | Block ব্যর্থ হলে বিকল্প টাস্ক চালায়। |
Always | Block এবং Rescue সফল বা ব্যর্থ যাই হোক, সবসময় চালায়। |
Ansible এ block
, rescue
, এবং always
ব্যবহার করে প্লেবুকগুলোকে আরও ফ্লেক্সিবল এবং রেসিলিয়েন্ট করা যায়, যাতে টাস্ক ব্যর্থ হলেও উপযুক্তভাবে হ্যান্ডেল করা সম্ভব হয়।